package com.debao.system.service.impl;

import java.util.*;
import java.util.stream.Collectors;

import cn.hutool.core.date.DateUtil;
import com.debao.common.constant.Constants;
import com.debao.system.domain.TimeUserCard;
import com.debao.system.domain.UserCourseCard;
import com.debao.system.mapper.TimeUserCardMapper;
import com.debao.system.mapper.UserCourseCardMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.debao.system.mapper.CourseCardMapper;
import com.debao.system.domain.CourseCard;
import com.debao.system.service.ICourseCardService;

/**
 * 课程卡Service业务层处理
 *
 * @author DeBao
 * @date 2024-06-13
 */
@Service
@Slf4j
public class CourseCardServiceImpl implements ICourseCardService {
    @Autowired
    private CourseCardMapper courseCardMapper;

    @Autowired
    private TimeUserCardMapper timeUserCardMapper;

    @Autowired
    private UserCourseCardMapper userCourseCardMapper;

    /**
     * 查询课程卡
     *
     * @param id 课程卡主键
     * @return 课程卡
     */
    @Override
    public CourseCard selectCourseCardById(Long id) {
        return courseCardMapper.selectCourseCardById(id);
    }

    @Override
    public List<Map<String, Object>> courseUserList(Long id) {
        CourseCard courseCard = courseCardMapper.selectCourseCardById(id);
        if (Objects.isNull(courseCard)) {
            return new ArrayList<>();
        }
        if (Objects.isNull(courseCard.getCourseType())) {
            return new ArrayList<>();
        }

        if (Objects.equals(courseCard.getCourseType().getType(), Constants.TIME_CARD)) {
            List<TimeUserCard> timeUserCardList = timeUserCardMapper.selectTimeUserCardList(new TimeUserCard().setCourseId(id));
            return timeUserCardList.stream().filter(timeUserCard ->
                    timeUserCard.getSurplus() > 0
            ).map(timeUserCard -> {
                Map<String, Object> map = new HashMap<>();
                map.put("user", timeUserCard.getEasyUser());
                map.put("desc", "剩余"+timeUserCard.getSurplus() + "次");
                return map;
            }).collect(Collectors.toList());
        }
        if (Objects.equals(courseCard.getCourseType().getType(), Constants.DAY_CARD)) {
            return userCourseCardMapper.selectUserCourseCardList(new UserCourseCard().setCourseCardId(id)).stream().filter(userCourseCard ->
                    DateUtil.parse(userCourseCard.getEndAt(), "yyyy-MM-dd").after(new Date())
            ).map(userCourseCard -> {
                Map<String, Object> map = new HashMap<>();
                map.put("user", userCourseCard.getSysUser());
                map.put("desc", userCourseCard.getEndAt() + "到期");
                return map;
            }).collect(Collectors.toList());
        }
        return new ArrayList<>();
    }


    /**
     * 查询课程卡列表
     *
     * @param courseCard 课程卡
     * @return 课程卡
     */
    @Override
    public List<CourseCard> selectCourseCardList(CourseCard courseCard) {
        return courseCardMapper.selectCourseCardList(courseCard);
    }

    /**
     * 新增课程卡
     *
     * @param courseCard 课程卡
     * @return 结果
     */
    @Override
    public int insertCourseCard(CourseCard courseCard) {
        return courseCardMapper.insertCourseCard(courseCard);
    }

    /**
     * 修改课程卡
     *
     * @param courseCard 课程卡
     * @return 结果
     */
    @Override
    public int updateCourseCard(CourseCard courseCard) {
        return courseCardMapper.updateCourseCard(courseCard);
    }


    /**
     * 批量删除课程卡
     *
     * @param ids 需要删除的课程卡主键
     * @return 结果
     */
    @Override
    public int deleteCourseCardByIds(Long[] ids) {
        return courseCardMapper.deleteCourseCardByIds(ids);
    }

    /**
     * 删除课程卡信息
     *
     * @param id 课程卡主键
     * @return 结果
     */
    @Override
    public int deleteCourseCardById(Long id) {
        return courseCardMapper.deleteCourseCardById(id);
    }

    /**
     * 批量更新课程销售数量
     *
     * @param courseCards
     */
    @Override
    public void updateCourseCardsInBatch(List<CourseCard> courseCards) {
        //批量更新课程销售数量
        courseCardMapper.updateCourseCardsInBatch(courseCards);

    }
}
